home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / libs / winlib-0.0 / winlib-0 / win / resize.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-02  |  7.3 KB  |  290 lines

  1. /*
  2.  * WINLIB
  3.  * Resizing routines
  4.  */
  5.  
  6. #include "winlib.h"
  7.  
  8. void _redraw_window(void)
  9. {
  10.     int i;
  11.  
  12.     /* And let the work window become scrollable */
  13.     scrollok(_wintree->workwin, TRUE);
  14.  
  15.     /* Draw the borders */
  16.     for(i = 0; i < _wintree->win->_maxx; i++) {
  17.     mvwaddch(_wintree->win, 0, i, ACS_DHLINE);
  18.     mvwaddch(_wintree->win, _wintree->win->_maxy, i, ACS_DHLINE);
  19.     }
  20.  
  21.     for(i = 0; i < _wintree->win->_maxy; i++) {
  22.     mvwaddch(_wintree->win, i, 0, ACS_DVLINE);
  23.     mvwaddch(_wintree->win, i, _wintree->win->_maxx, ACS_DVLINE);
  24.     }
  25.  
  26.     /* Add the corners */
  27.     mvwaddch(_wintree->win, 0, 0, ACS_DULCORNER);
  28.     mvwaddch(_wintree->win, 0, _wintree->win->_maxx, ACS_DURCORNER);
  29.     mvwaddch(_wintree->win, _wintree->win->_maxy, 0, ACS_DLLCORNER);
  30.     mvwaddch(_wintree->win, _wintree->win->_maxy, _wintree->win->_maxx, ACS_DLRCORNER);
  31.  
  32.     /* And the title */
  33.     i = (_wintree->win->_maxx - strlen(_wintree->title)) / 2;
  34.     mvwaddstr(_wintree->win, 0, i, _wintree->title);
  35.  
  36.     /* Add a closer button if there is one */
  37.     if (_wintree->mode & CLOSER) {
  38.     mvwaddch(_wintree->win, 0, 1, '[');
  39.     mvwaddch(_wintree->win, 0, 2, ACS_BULLET);
  40.     mvwaddch(_wintree->win, 0, 3, ']');
  41.     }
  42.  
  43.     /* Add a mover indicator around the title bar if you can move the window */
  44.     if (_wintree->mode & MOVER) {
  45.     mvwaddch(_wintree->win, 0, i - 1, ' ');
  46.     mvwaddch(_wintree->win, 0, i - 2, '[');
  47.     mvwaddch(_wintree->win, 0, i + strlen(_wintree->title), ' ');
  48.     mvwaddch(_wintree->win, 0, i + strlen(_wintree->title) + 1, ']');
  49.     }
  50.  
  51.     i = 0;
  52.  
  53.     /* Put a minimizer button in */
  54.     if (_wintree->mode & MINIMIZER) {
  55.     mvwaddch(_wintree->win, 0, _wintree->win->_maxx - 1, ']');
  56.     mvwaddch(_wintree->win, 0, _wintree->win->_maxx - 2, ACS_DARROW);
  57.     mvwaddch(_wintree->win, 0, _wintree->win->_maxx - 3, '[');
  58.     i = 3;
  59.     }
  60.  
  61.     /* And a maximizer */
  62.     if (_wintree->mode & MAXIMIZER) {
  63.     mvwaddch(_wintree->win, 0, _wintree->win->_maxx - (1 + i), ']');
  64.     mvwaddch(_wintree->win, 0, _wintree->win->_maxx - (2 + i), ACS_UARROW);
  65.     mvwaddch(_wintree->win, 0, _wintree->win->_maxx - (3 + i), '[');
  66.     }
  67.  
  68.     /* And the sizer stuff */
  69.     if (_wintree->mode & SIZER) {
  70.     mvwaddch(_wintree->win, 0, 0, ACS_ULCORNER);
  71.     mvwaddch(_wintree->win, 0, _wintree->win->_maxx, ACS_URCORNER);
  72.     mvwaddch(_wintree->win, _wintree->win->_maxy, 0, ACS_LLCORNER);
  73.     mvwaddch(_wintree->win, _wintree->win->_maxy, _wintree->win->_maxx, ACS_LRCORNER);
  74.     }
  75. }
  76.  
  77. void _do_resize(Gpm_Event *event)
  78. {
  79.     /* Upper left */
  80.     if ((_resize_corner == 1) && (_cur_window != -1)) {
  81.     int w, h, found = 0;
  82.  
  83.     w = _wintree->cur.x + _wintree->cur.w;
  84.     h = _wintree->cur.y + _wintree->cur.h;
  85.  
  86.     if (event->y < 1)
  87.         event->y = 1;
  88.  
  89.     if (event->x < _wintree->cur.x) {
  90.         int diff = abs(event->x - _wintree->cur.x);
  91.  
  92.         _wintree->cur.w += diff;
  93.         _wintree->cur.x = event->x;
  94.         found = 1;
  95.     } else if ((event->x > _wintree->cur.x) && (!found)) {
  96.         int diff = abs(event->x - _wintree->cur.x);
  97.  
  98.         _wintree->cur.w -= diff;
  99.         _wintree->cur.x = event->x;
  100.         found = 1;
  101.     }
  102.  
  103.     found = 0;
  104.  
  105.     if ((event->y < _wintree->cur.y) && (!found)) {
  106.         int diff = abs(event->y - _wintree->cur.y);
  107.  
  108.         _wintree->cur.h += diff;
  109.         _wintree->cur.y = event->y;
  110.         found = 1;
  111.     } else if ((event->y > _wintree->cur.y) && (!found)) {
  112.         int diff = abs(event->y - _wintree->cur.y);
  113.  
  114.         _wintree->cur.h -= diff;
  115.         _wintree->cur.y = event->y;
  116.     }
  117.  
  118.     if (_wintree->cur.w < 8) {
  119.         _wintree->cur.w = 8;
  120.         _wintree->cur.x = w - 8;
  121.     }
  122.  
  123.     if (_wintree->cur.h < 4) {
  124.         _wintree->cur.h = 4;
  125.         _wintree->cur.y = h - 4;
  126.     }
  127.     }
  128.  
  129.     /* Upper right */
  130.     if ((_resize_corner == 2) && (_cur_window != -1)) {
  131.     int found = 0, h;
  132.  
  133.     h = _wintree->cur.y + _wintree->cur.h;
  134.  
  135.     if (event->y < 1)
  136.         event->y = 1;
  137.  
  138.     if (event->x < (_wintree->cur.x + _wintree->cur.w)) {
  139.         int diff = abs(event->x - (_wintree->cur.x + _wintree->cur.w));
  140.  
  141.         _wintree->cur.w -= diff;
  142.         _wintree->cur.w++;
  143.         found = 1;
  144.     } else if ((event->x >= (_wintree->cur.x + _wintree->cur.w)) && (!found)) {
  145.         int diff = abs(event->x - (_wintree->cur.x + _wintree->cur.w));
  146.  
  147.         _wintree->cur.w += diff;
  148.         _wintree->cur.w++;
  149.         found = 1;
  150.     }
  151.  
  152.     found = 0;
  153.  
  154.     if ((event->y < _wintree->cur.y) && (!found)) {
  155.         int diff = abs(event->y - _wintree->cur.y);
  156.  
  157.         _wintree->cur.h += diff;
  158.         _wintree->cur.y = event->y;
  159.         found = 1;
  160.     } else if ((event->y > _wintree->cur.y) && (!found)) {
  161.         int diff = abs(event->y - _wintree->cur.y);
  162.  
  163.         _wintree->cur.h -= diff;
  164.         _wintree->cur.y = event->y;
  165.     }
  166.  
  167.     if (_wintree->cur.w < 8)
  168.         _wintree->cur.w = 8;
  169.     if (_wintree->cur.h < 4) {
  170.         _wintree->cur.h = 4;
  171.         _wintree->cur.y = h - 4;
  172.     }
  173.     }
  174.  
  175.     /* Lower left */
  176.     if ((_resize_corner == 3) && (_cur_window != -1)) {
  177.     int x, y, w, h, found = 0;
  178.  
  179.     x = _wintree->cur.x;
  180.     y = _wintree->cur.y;
  181.     w = _wintree->cur.x + _wintree->cur.w;
  182.     h = _wintree->cur.y + _wintree->cur.h;
  183.  
  184.     if (event->y < 1)
  185.         event->y = 1;
  186.  
  187.     if (event->x < _wintree->cur.x) {
  188.         int diff = abs(event->x - _wintree->cur.x);
  189.  
  190.         _wintree->cur.w += diff;
  191.         _wintree->cur.x = event->x;
  192.         found = 1;
  193.     } else if ((event->x > _wintree->cur.x) && (!found)) {
  194.         int diff = abs(event->x - _wintree->cur.x);
  195.  
  196.         _wintree->cur.w -= diff;
  197.         _wintree->cur.x = event->x;
  198.         found = 1;
  199.     }
  200.  
  201.     found = 0;
  202.  
  203.     _wintree->cur.h = event->y - _wintree->win->_begy;
  204.     _wintree->cur.h++;
  205.  
  206.     if (_wintree->cur.w < 8) {
  207.         _wintree->cur.w = 8;
  208.         _wintree->cur.x = w - 8;
  209.     }
  210.  
  211.     if (_wintree->cur.h < 4)
  212.         _wintree->cur.h = 4;
  213.     }
  214.  
  215.     /* Lower right */
  216.     if ((_resize_corner == 4) && (_cur_window != -1)) {
  217.     if (event->y < 1)
  218.         event->y = 1;
  219.  
  220.     _wintree->cur.w = event->x - _wintree->win->_begx;
  221.     _wintree->cur.h = event->y - _wintree->win->_begy;
  222.  
  223.     _wintree->cur.w++;
  224.     _wintree->cur.h++;
  225.  
  226.     if (_wintree->cur.w < 8)
  227.         _wintree->cur.w = 8;
  228.     if (_wintree->cur.h < 4)
  229.         _wintree->cur.h = 4;
  230.     }
  231.  
  232.     /* And process it all */
  233.     if ((_cur_window != -1) && (_resize_corner)) {
  234.     del_panel(_wintree->pan);
  235.     del_panel(_wintree->workpan);
  236.     delwin(_wintree->win);
  237.     delwin(_wintree->workwin);
  238.  
  239.     _wintree->win = newwin(_wintree->cur.h, _wintree->cur.w,
  240.         _wintree->cur.y, _wintree->cur.x);
  241.     _wintree->workwin = newwin(_wintree->cur.h - 2, _wintree->cur.w - 2,
  242.         _wintree->cur.y + 1, _wintree->cur.x + 1);
  243.     _wintree->pan = new_panel(_wintree->win);
  244.     _wintree->workpan = new_panel(_wintree->workwin);
  245.  
  246.     _redraw_window();
  247.     }
  248. }
  249.  
  250. void _handle_resize(Gpm_Event *event)
  251. {
  252. #define    SET_CORNER(x)    { _resizing_win = TRUE; _resize_corner = x; }
  253.  
  254.     if ((event->buttons & GPM_B_LEFT) &&
  255.     (event->type & GPM_UP)) {
  256.     _resizing_win = FALSE;
  257.     _resize_corner = 0;
  258.     return;
  259.     }
  260.  
  261.     if (!_resizing_win) {
  262.     if ((event->buttons & GPM_B_LEFT) &&
  263.         (event->type & GPM_DOWN)) {
  264.         /* Upper left */
  265.         if ((event->x == _wintree->win->_begx) &&
  266.         (event->y == _wintree->win->_begy))
  267.         SET_CORNER(1);
  268.  
  269.         /* Upper right */
  270.         if ((event->x == _wintree->win->_begx + _wintree->win->_maxx) &&
  271.         (event->y == _wintree->win->_begy))
  272.         SET_CORNER(2);
  273.  
  274.         /* Lower left */
  275.         if ((event->x == _wintree->win->_begx) &&
  276.         (event->y == _wintree->win->_begy + _wintree->win->_maxy))
  277.         SET_CORNER(3);
  278.  
  279.         /* Lower right */
  280.         if ((event->x == _wintree->win->_begx + _wintree->win->_maxx) &&
  281.         (event->y == _wintree->win->_begy + _wintree->win->_maxy))
  282.         SET_CORNER(4);
  283.     }
  284.     } else {
  285.     _do_resize(event);
  286.     }
  287.  
  288. #undef    SET_CORNER
  289. }
  290.